C++-এ স্মার্ট পয়েন্টার (Smart Pointers) এমন পয়েন্টার যা মেমরি ম্যানেজমেন্ট সহজ করে এবং স্মৃতি রিকল (memory leaks) বা ডাবল ডিলিট (double delete) সমস্যা প্রতিরোধ করে। C++11 থেকে, std::unique_ptr
, std::shared_ptr
, এবং std::weak_ptr
এই তিনটি স্মার্ট পয়েন্টার স্ট্যান্ডার্ড লাইব্রেরির অংশ হিসেবে অন্তর্ভুক্ত হয়েছে, এবং তারা মেমরি পরিচালনার ক্ষেত্রে অনেক সুবিধা প্রদান করে। এই স্মার্ট পয়েন্টারগুলি স্বয়ংক্রিয়ভাবে মেমরি রিলিজ করে, যখন এটি আর ব্যবহৃত হয় না।
নিচে এই স্মার্ট পয়েন্টারগুলির ব্যাখ্যা এবং উদাহরণ দেওয়া হলো:
std::unique_ptr
std::unique_ptr
একটি স্মার্ট পয়েন্টার যা একক মালিকানায় একটি অবজেক্টের মালিকানার প্রতিনিধিত্ব করে। এটি এমন একটি পয়েন্টার যা এক সময়ে শুধুমাত্র একটি অবজেক্টের মালিক হতে পারে। মালিকানার স্থানান্তর করা যেতে পারে, তবে একাধিক unique_ptr
একই অবজেক্টের মালিক হতে পারে না।
unique_ptr
এক সময়ে একটি অবজেক্টের মালিক হতে পারে।unique_ptr
জীবনাবসান ঘটে, তখন এটি নিজে থেকেই সংশ্লিষ্ট অবজেক্টকে ডিলিট করে।unique_ptr
থেকে অন্য unique_ptr
এ স্থানান্তর করা যেতে পারে, তবে এটি কপি করা সম্ভব নয়।#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "Constructor called!" << std::endl; }
~MyClass() { std::cout << "Destructor called!" << std::endl; }
void show() { std::cout << "MyClass object is here!" << std::endl; }
};
int main() {
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); // unique_ptr তৈরি
ptr1->show(); // অবজেক্টের মেথড কল
// মালিকানা স্থানান্তর করা
std::unique_ptr<MyClass> ptr2 = std::move(ptr1); // ptr1 থেকে ptr2 তে মালিকানা স্থানান্তর
if (!ptr1) {
std::cout << "ptr1 no longer owns the object." << std::endl;
}
return 0;
}
আউটপুট:
Constructor called!
MyClass object is here!
Destructor called!
std::shared_ptr
std::shared_ptr
একটি স্মার্ট পয়েন্টার যা অনেকগুলি মালিকানায় একটি অবজেক্টের মালিকানা প্রতিনিধিত্ব করে। এটি একই অবজেক্টের জন্য একাধিক shared_ptr
তৈরি করতে দেয় এবং সমস্ত shared_ptr
যখন অবজেক্টটি আর ব্যবহার করা হয় না, তখন ঐ অবজেক্টের মেমরি মুক্ত করা হয়। এটি রেফারেন্স কাউন্টিং ব্যবহার করে, যাতে একটি অবজেক্টের জন্য কতগুলি shared_ptr
রয়েছে তা ট্র্যাক করা হয়।
shared_ptr
একই অবজেক্টের মালিক হতে পারে।#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "Constructor called!" << std::endl; }
~MyClass() { std::cout << "Destructor called!" << std::endl; }
void show() { std::cout << "MyClass object is here!" << std::endl; }
};
int main() {
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(); // shared_ptr তৈরি
ptr1->show();
{
std::shared_ptr<MyClass> ptr2 = ptr1; // ptr1 এর মালিকানা ptr2 তে স্থানান্তর
std::cout << "Inside block, use_count: " << ptr1.use_count() << std::endl;
} // ptr2 বাহির হয়ে যায়
std::cout << "Outside block, use_count: " << ptr1.use_count() << std::endl;
return 0;
}
আউটপুট:
Constructor called!
MyClass object is here!
Inside block, use_count: 2
Outside block, use_count: 1
Destructor called!
std::weak_ptr
std::weak_ptr
একটি স্মার্ট পয়েন্টার যা shared_ptr
এর মালিকানার অংশীদার হিসেবে কাজ করে, কিন্তু এটি রেফারেন্স কাউন্টিংয়ে অংশগ্রহণ করে না। এটি মূলত সাইক্লিক রেফারেন্স (circular references) এড়াতে ব্যবহৃত হয়। যখন একটি weak_ptr
থেকে অবজেক্ট অ্যাক্সেস করা হয়, তখন এটি একটি shared_ptr
তৈরি করতে পারে, তবে এটি কোনো রেফারেন্স কাউন্টিং বাড়ায় না।
weak_ptr
রেফারেন্স কাউন্টিং বাড়ায় না, তাই এটি সাইক্লিক রেফারেন্সের সমস্যা সৃষ্টি করে না।shared_ptr
থেকে অ্যাক্সেস: weak_ptr
থেকে অবজেক্ট অ্যাক্সেস করতে হলে, একটি shared_ptr
তৈরি করতে হয়।#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "Constructor called!" << std::endl; }
~MyClass() { std::cout << "Destructor called!" << std::endl; }
void show() { std::cout << "MyClass object is here!" << std::endl; }
};
int main() {
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(); // shared_ptr তৈরি
std::weak_ptr<MyClass> weakPtr = ptr1; // weak_ptr তৈরি
std::cout << "Use count before: " << ptr1.use_count() << std::endl;
if (auto temp = weakPtr.lock()) { // weak_ptr থেকে shared_ptr তৈরি
temp->show();
} else {
std::cout << "Object no longer exists!" << std::endl;
}
ptr1.reset(); // shared_ptr এর মালিকানা শেষ
std::cout << "Use count after: " << ptr1.use_count() << std::endl;
if (auto temp = weakPtr.lock()) {
temp->show();
} else {
std::cout << "Object no longer exists!" << std::endl;
}
return 0;
}
আউটপুট:
Constructor called!
Use count before: 1
MyClass object is here!
Use count after: 0
Object no longer exists!
Destructor called!
std::weak_ptr
সাইক্লিক রেফারেন্সের সমস্যা প্রতিরোধ করে, যা std::shared_ptr
এর মাধ্যমে তৈরি হতে পারে।std::unique_ptr
: একক মালিকানার পয়েন্টার, যা মালিকানার স্থানান্তর করতে পারে, কিন্তু কপি করা যায় না।std::shared_ptr
: একাধিক মালিকানার পয়েন্টার, যা রেফারেন্স কাউন্টিং ব্যবহার করে অবজেক্টটি মুছে ফেলা হয় যখন সমস্ত shared_ptr
শেষ হয়।std::weak_ptr
: shared_ptr
থেকে সম্পর্কিত পয়েন্টার, তবে এটি রেফারেন্স কাউন্টিংয়ে অংশগ্রহণ করে না, যা সাইক্লিক রেফারেন্স এড়াতে সাহায্য করে।এই স্মার্ট পয়েন্টারগুলি C++ কোডে মেমরি ম্যানেজমেন্ট সহজ, নিরাপদ, এবং দক্ষ করে তোলে।
Read more